import logging
import unittest
from time import sleep
import traceback

import requests
from parameterized import parameterized

from api.regLoginApi import RegLoginApi
from common import utils
from common.utils import clear_user_info


class TestRegLogin(unittest.TestCase):

    @classmethod
    def setUpClass(cls) -> None:
        clear_user_info()

    def setUp(self) -> None:
        # 创建session对象
        self.session = requests.session()
        # 实例化封装接口的类的对象
        self.reg_login_api = RegLoginApi(self.session)

    def tearDown(self) -> None:
        # 关闭session对象
        self.session.close()

    # 获取图片验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "img_verify_code"))
    def test01_img_verify_code(self, r, exp_status_code):
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.get_img_verify_code(r)
        # 断言
        self.assertEqual(exp_status_code, res.status_code)

    # 获取短信验证码测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "phone_verify_code"))
    def test02_phone_verify_code(self, phone, imgVerifyCode, exp_status_code, exp_status, description):
        # 调用封装接口请求的方法，获取响应结果
        # 获取图片验证码成功
        self.reg_login_api.get_img_verify_code(123321231)
        # 获取短信验证码
        res = self.reg_login_api.get_phone_verify_code(phone, imgVerifyCode)

        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_status_code, exp_status, description)
        # # 断言状态码
        # self.assertEqual(200, res.status_code)
        # # 断言status
        # self.assertEqual(200, res_dict.get("status"))
        # # 断言description
        # self.assertIn("短信发送成功", res_dict.get("description"))

    # 注册测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "user_register"))
    def test03_register(self, phone, password, imgVerifyCode, phoneVerifyCode, dyServer, invitePhone, exp_status_code,
                        exp_status, description):
        # 调用封装接口请求的方法，获取响应结果
        # 获取图片验证码成功
        self.reg_login_api.get_img_verify_code(123321231)
        # 获取短信验证码
        self.reg_login_api.get_phone_verify_code(phone, "8888")
        # 注册接口
        res = self.reg_login_api.user_register(phone, password, imgVerifyCode, phoneVerifyCode, dyServer, invitePhone)

        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_status_code, exp_status, description)

    # 登录测试用例
    @parameterized.expand(utils.read_json("reg_login_data", "user_login"))
    def test04_user_login(self, mobile, password, exp_status_code, exp_status, description):
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.user_login(mobile, password)

        # 断言--调用公共断言方法
        utils.common_assert(self, res, exp_status_code, exp_status, description)

    @unittest.skip
    def test05_user_login_pwd_check(self):
        # 第一次密码错误
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.user_login("15814662512", "123333")
        # 断言--调用公共断言方法
        utils.common_assert(self, res, 200, 100, "密码错误1次")

        # 第二次密码错误
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.user_login("15814662512", "123333")
        # 断言--调用公共断言方法
        utils.common_assert(self, res, 200, 100, "密码错误2次")

        # 第三次密码错误
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.user_login("15814662512", "123333")
        # 断言--调用公共断言方法
        utils.common_assert(self, res, 200, 100, "由于连续输入错误密码达到上限")

        # 等待60S
        sleep(60)

        # 登录成功
        # 调用封装接口请求的方法，获取响应结果
        res = self.reg_login_api.user_login("15814662512", "123321")

        # 断言--调用公共断言方法
        utils.common_assert(self, res, 200, 200, "登录成功")
